package com.gb.web.common.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * Description: 采用AES负责字符串的加密与解密
 */
public class SecUtil {

	private static final Log logger = LogFactory.getLog(SecUtil.class);
	/**
	 * key 可自定义
	 */
	private static byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x50,
			0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 };

	public static void main(String[] args) throws Exception {
		BufferedReader reader;
		try {
			String st = "";
			System.out.println("AES加密与解密操作:");
			System.out.println("\"E\":加密 \t\"D\":解密\t\t\"Q\":退出");
			do{
				if("".equals(st)) {
					System.out.println("请输入操作代码:");
				}
				reader = new BufferedReader(new InputStreamReader(System.in));
				st = reader.readLine();
				if("E".equalsIgnoreCase(st)) {
					System.out.println("请输入待加密字符串:");
					st = reader.readLine();
					if(!"".equals(st.trim())) {
						System.out.println("加密前:" + st.trim());
						System.out.println("加密后:" + encrypt(st.trim()) + "\n\n");
					}
					st = "";
				}else if("D".equalsIgnoreCase(st)) {
					System.out.println("请输入待解密字符串:");
					st = reader.readLine();
					if(!"".equals(st.trim())) {
						System.out.println("解密前:" + st.trim());
						System.out.println("解密后:" + decrypt(st.trim()) + "\n\n");
					}
					st = "";
				}
			} while(!st.equalsIgnoreCase("Q"));
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * @Title encrypt
	 * @Description: 加密
	 */
	public static String encrypt(String value) {
		String s = null;
		int mode = Cipher.ENCRYPT_MODE;
		try {
			Cipher cipher = initCipher(mode);
			byte[] outBytes = cipher.doFinal(value.getBytes());
			s = String.valueOf(Hex.encodeHex(outBytes));
		} catch (Exception e) {
			logger.error(e);
		}
		return s;
	}

	/**
	 * @Title decrypt
	 * @Description: 解密
	 * @return: String
	 */
	public static String decrypt(String value) {
		String s = null;
		int mode = Cipher.DECRYPT_MODE;
		try {
			Cipher cipher = initCipher(mode);
			byte[] outBytes = cipher
					.doFinal(Hex.decodeHex(value.toCharArray()));
			s = new String(outBytes);
		} catch (Exception e) {
			logger.error(e);
		}
		return s;
	}

	/**
	 * @Description: 初始化密码
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeyException
	 */
	private static Cipher initCipher(int mode) throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException {
		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
		Key key = new SecretKeySpec(keybytes, "AES");
		cipher.init(mode, key);
		return cipher;
	}
}